#include <U8g2lib.h>//调用U8g2库函数：用于控制OLED屏幕
#include <DHT.h>

// 使用软件I2C（D2=SDA, D3=SCL）
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, 3, 2, U8X8_PIN_NONE);

// DHT11配置
#define DHTPIN 7
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

// 轻量字体
#define USE_SMALL_FONT 1

void setup() {
  u8g2.begin();
  dht.begin();
}

void loop() {
  // 读取温湿度数据（使用局部变量）
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();
  
  if (isnan(humidity) || isnan(temperature)) {
    displayError(F("Sensor Error!"));
    delay(2000);
    return;
  }
  
  displayData(humidity, temperature);
  delay(2000);
}

void displayData(float humidity, float temperature) {
  u8g2.firstPage();
  do {
    #ifdef USE_SMALL_FONT
      u8g2.setFont(u8g2_font_5x7_tf);  // 更小的字体
    #else
      u8g2.setFont(u8g2_font_ncenB08_tr);
    #endif
    
    u8g2.setCursor(0, 10);
    u8g2.print(F("Env Data"));
    
    u8g2.setCursor(0, 25);
    u8g2.print(F("Temp: "));
    u8g2.print(temperature, 1);  // 保留1位小数
    u8g2.print(F(" C"));
    
    u8g2.setCursor(0, 40);
    u8g2.print(F("Humidity: "));
    u8g2.print(humidity, 1);
    u8g2.print(F(" %"));
    
  } while (u8g2.nextPage());
}

void displayError(const __FlashStringHelper* message) {
  u8g2.firstPage();
  do {
    #ifdef USE_SMALL_FONT
      u8g2.setFont(u8g2_font_5x7_tf);
    #else
      u8g2.setFont(u8g2_font_ncenB08_tr);
    #endif
    
    u8g2.setCursor(0, 30);
    u8g2.print(F("ERROR:"));
    u8g2.setCursor(0, 45);
    u8g2.print(message);
  } while (u8g2.nextPage());
}
